// js的运算符
//  + 赋值运算符 ： =  += -= *= /=
let str = "字符串变量值";
let str1 = "初始值";
str1 += "-新字符串"; // 字符串拼接赋值运算
console.log(str1)
// --------------
let num = 100;
num += 20; // 数学加法运算
console.log(num)
// --------------
let info = "info";
// 启动自动类型转换，将数值20转换为了字符串
//  - 优先转换为字符串
//  - 只有+=左右两边均为数值启动数学运算
info += 20;
console.log(info)
let size = 50;
// size += "字符串";
size += "20";
console.log(size);
// --------------
let str2 = "字符串";
// -= *= /=  只能针对于数值进行运算，如果运算变量存在非数值，会直接返回NaN
str2 -= 10; // NaN
console.log(str2);
// --------------
let num2 = 100;
num2 /= 50;
console.log(num2);
// --------------
let num3 = 3;
num3 *= 3;
console.log(num3);
// --------------
let num4 = 9;
num4 %= 2;
console.log(num4);

//  + 数学(算数)运算符 ： + -  /  %  *  **(求模) ++ --
console.log( "字符串1"+"字符串2" ); // 字符串拼接
console.log( "字符串1"+100 ); // 优先将非字符串数据转换为字符串
console.log( "字符串1"+true );// 优先将非字符串数据转换为字符串
console.log( 100+20 ); // 数学加法运算
console.log( true+20 ); // 数学加法运算 - true=1
console.log( false+20 ); // 数学加法运算 - false=0
console.log( null+20 ); // 数学加法运算 - null=0
console.log( 2**3 ); // 2的三次方 => 8
let num5 = 10;
console.log( ++num5 ) // 先+1,再调用 => 11
console.log( num5++ ) // 先调用，再+1 => 11
console.log( num5 ) // 12
console.log(num5+++10)
console.log(num5) // 13

//  + 比较运算 ：> >= < <= != == === !==
console.log( 10 > 9 );
console.log(10 == 10);
console.log("abc" == "abc");
// JS中==左右类型不匹配，会对其中一个变量进行类型转换，进行比较 ，所有 == 只比较值
console.log( 10 == "10" ); // 数值与字符串 => 将字符串转换数值
// NaN 是不能使用 == 做比较的,因为JS对该变量的定义时，并不是提供一个固定取值，
//      而是一个首位固定的随机值 - 所以每一个NaN虽然意义上表示非数值，但内存中取值却不会相同
//      因此 == 结果永远为false，判断是否为 NaN 只能通过JS内置方法 isNaN(变量)
console.log( NaN == "aaa" );
console.log( NaN == NaN ); // false
console.log( isNaN("aaa") );
// -------------
console.log( 10==true ); // boolean类型变量转换为数值进行比较
console.log( true==10 ); // boolean类型变量转换为数值进行比较
console.log( 1==true ); // boolean类型变量转换为数值进行比较
console.log( true==1 ); // boolean类型变量转换为数值进行比较
// -------------
//  非空字符串 转换为 boolean 类型的结果为 true
//  空字符串 转换为 boolean 类型的结果为 false
//  boolean 类型 true 转换为 字符串结果为 "true"
//  boolean 类型 false 转换为 字符串结果为 "false"

// 当字符串为空字符串优先将字符串转换为boolean,
// 当字符串为非空字符串时，借助number作为中转类型进行类型转换比较
console.log( "aaaa"==true ); // "aaaa"=="true" => false
console.log( "true"==true ); // "true"=="true" => true
console.log( "1"==true ); // "true"=="true" => true
console.log( ""==false );

// === 恒等于 !== 恒不等于
// 类型+值的同时比较，必须保证类型相同，值也相同时 返回true
console.log( "1"==1 );
console.log( "1"===1 );

//  + 逻辑运算 ：&& || & |
// JS 的 && 和 || 是存在返回值的
//      && 的左侧变量为false则返回左侧值，左侧为true则返回右侧值
let result1 = false&&true; // && 两边均为true 则返回true 否则返回 false
console.log(result1) // false
let result2 = true&&true;  // && 两边均为true 则返回true 否则返回 false
console.log(result2) // true
let result3 = false&&100; // && 是阻断运算符，左侧条件已经是false,最终结果就是false
console.log(result3) // false
let result4 = true&&100; // && 是阻断运算符，左侧条件为true,返回右侧值
console.log(result4) // 100
let result41 = true&&0; // && 是阻断运算符，左侧条件为true,返回右侧值
console.log(result41) // 0
let result42 = true&&"aaa"; // && 是阻断运算符，左侧条件为true,返回右侧值
console.log(result42) // "aaa";
let result43 = true&&""; // && 是阻断运算符，左侧条件为true,返回右侧值
console.log(result43) // "";
let result5 = 100&&false;
console.log(result5) // false
let result51 = 0&&false; // && 是阻断运算符，左侧条件为false,返回左侧值
console.log(result51) // false
let result6 = 100
    &&true;
console.log(result6) // true

//      || 的左侧变量为false则返回右侧值，左侧为true则返回左侧值
console.log( false||100 );
console.log( "aaaa"||0 );

let arg = "";  // "" => false  "非空" => true
let num6 = 10; // 0 => false  非0 => true
console.log( arg&&num6 );

// & | 位运算
console.log( true&true );
console.log( true&false );

//  + 三目运算符 ： 条件?真:假;
console.log( true?"条件为true":"条件为false" )
console.log( false?"条件为true":"条件为false" )

console.log( 100>"aa"?"真":"假" ); // "假" 转换后 100>NaN 比较，条件不合法
console.log( 1>false?"真":"假" ); // "真"  转换后 1>0
// "真"  因为 1 转换为true ，所以返回"aaa"
// "aaa" 非空 转换为 true ，三目条件为 真
console.log( 1&&"aaa"?"真":"假" );
console.log( 1&&""?"真":"假" );













